# coding:utf-8
# Project:pyinterface
# author:wj
# time:2022/12/30 17:15
# Email:1305137785@qq.com
import allure,json
from jsonpath import jsonpath
from loguru import logger
# from unittest import TestCase
class HandleResponse:
    def __init__(self):
        pass
        # self.my_assert = TestCase()
    #响应结果统一处理
    @allure.step('响应结果统一处理')
    def handle_response(self,response):
        try:
            if isinstance(response.json(),dict):
                allure.attach(body=f'{response.json()}', name='统一处理响应数据', attachment_type=allure.attachment_type.TEXT)
                return {"response_type":"json","response":response.json()}
        except Exception as e:
                allure.attach(body=f'{response.text}', name='统一处理响应数据', attachment_type=allure.attachment_type.TEXT)
                return {"response_type": "str", "response": response.text}

    #接口断言
    @allure.step("接口返回数据断言")
    def assert_response(self,expected_data ,response):
        """
        思路：
        1、获取期望结果
        2、通过期望结果的key去响应结果里面去取数据，组成新的字典
        3、期望结果的字典和实际结果的字典进行对比
        :param expected_data: {key：12333}
        :param response:
        :return:
        """
        if expected_data:
            actual_data = {}
            expected_data = expected_data if isinstance(expected_data,dict) else json.loads(expected_data)
            print("期望结果：", expected_data)
            logger.info(f'期望结果：{expected_data}')
            allure.attach(body=f'{expected_data}',name=f'期望结果：{expected_data}',attachment_type=allure.attachment_type.TEXT)
            for key in expected_data:
                print("通过期望结果的key，组成实际结果")
                actual_data[key]=jsonpath(response,f"$..{key}")[0]
            print("实际结果：",actual_data)
            logger.info(f'实际结果：{actual_data}')
            allure.attach(body=f'{actual_data}',name=f'实际结果：{actual_data}',attachment_type=allure.attachment_type.TEXT)
            #断言期望结果和实际结果(比对字典)
            # self.my_assert.assertEqual(expected_data,actual_data)
            try:
                assert expected_data==actual_data
            except AssertionError:
                logger.exception('接口响应断言失败')
                raise AssertionError
        else:
            allure.attach(body='excel中expected_data期望结果为空，不需要响应断言',name='excel中expected_data期望结果为空，不需要响应断言',
                          attachment_type=allure.attachment_type.TEXT)
            print("excel中expected_data期望结果为空，不需要断言")